package com.songlanyun.modules.cnarea.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.songlanyun.common.enums.HouniaoConstant;
import com.songlanyun.common.utils.HouniaoApiUtil;
import com.songlanyun.modules.cnarea.dao.CnAreaHNDao;
import com.songlanyun.modules.cnarea.entity.CnArea;
import com.songlanyun.modules.cnarea.entity.CnAreaHN;
import com.songlanyun.modules.cnarea.service.CnAreaHNService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;


@Service("cnAreaHNService")
public class CnAreaHNServiceImpl extends ServiceImpl<CnAreaHNDao, CnAreaHN> implements CnAreaHNService {

    // 省
    List<CnAreaHN> province = new ArrayList<>();
    // 市
    List<CnAreaHN> city = new ArrayList<>();
    // 区
    List<CnAreaHN> area = new ArrayList<>();
    // 街道
    List<CnAreaHN> street = new ArrayList<>();

    @Autowired
    private HouniaoApiUtil houniaoApiUtil;

    /**
     * 获取省市区编码
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public void hnRefresh() {
        // 获取候鸟第三方数据
        JSONObject req = new JSONObject();
        JSONObject jsonObject = houniaoApiUtil.client(req, HouniaoConstant.AREAS_LIST.getUrl());
        // 保存数据
        this.saveToDB(jsonObject);
    }

    /**
     * 获取省份地址
     * @return
     */
    @Override
    public JSONObject getProvince() {
        // 获取候鸟第三方数据
        JSONObject req = new JSONObject();
        JSONObject jsonObject = houniaoApiUtil.client(req, HouniaoConstant.AREAS_PROVINCE.getUrl());
        // 返回数据
        return jsonObject;
    }

    /**
     * 获取省份下级地址
     * @param provinceCode
     * @return
     */
    @Override
    public JSONObject getCity(String provinceCode) {
        // 获取候鸟第三方数据
        JSONObject req = new JSONObject();
        req.put("province_id", provinceCode);
        JSONObject jsonObject = houniaoApiUtil.client(req, HouniaoConstant.AREAS_AREA_LIST.getUrl());
        // 返回数据
        return jsonObject;
    }

    /**
     * 保存到数据库
     */
    private void saveToDB(JSONObject jsonObject) {
        // 截断表
        this.baseMapper.truncate();
        // 获取省数据
        JSONArray first = jsonObject.getJSONArray("data");
        /**
         * 保存一级数据
         */
        joinBatch(first, 1);
        /**
         * 保存二级数据
         */
        saveData(first);
        // 保存
        this.saveBatch(this.province);
        this.saveBatch(this.city);
        this.saveBatch(this.area);
        this.saveBatch(this.street);
    }

    private void joinBatch(JSONArray jsonArray, int level) {
        switch (level) {
            case 1:
                jsonArray.forEach(o -> {
                    CnAreaHN c = new CnAreaHN();
                    JSONObject jsonObject = (JSONObject) o;
                    c.setAid(Long.valueOf(jsonObject.getString("id")));
                    c.setArea_name(jsonObject.getString("area_name"));
                    c.setPid(Long.valueOf(jsonObject.getString("pid")));
                    c.setLevel(Long.valueOf(level));
                    province.add(c);
                });
                break;
            case 2:
                jsonArray.forEach(o -> {
                    CnAreaHN c = new CnAreaHN();
                    JSONObject jsonObject = (JSONObject) o;
                    c.setAid(Long.valueOf(jsonObject.getString("id")));
                    c.setArea_name(jsonObject.getString("area_name"));
                    c.setPid(Long.valueOf(jsonObject.getString("pid")));
                    c.setLevel(Long.valueOf(level));
                    city.add(c);
                });
                break;
            case 3:
                jsonArray.forEach(o -> {
                    CnAreaHN c = new CnAreaHN();
                    JSONObject jsonObject = (JSONObject) o;
                    c.setAid(Long.valueOf(jsonObject.getString("id")));
                    c.setArea_name(jsonObject.getString("area_name"));
                    c.setPid(Long.valueOf(jsonObject.getString("pid")));
                    c.setLevel(Long.valueOf(level));
                    area.add(c);
                });
                break;
            case 4:
                jsonArray.forEach(o -> {
                    CnAreaHN c = new CnAreaHN();
                    JSONObject jsonObject = (JSONObject) o;
                    c.setAid(Long.valueOf(jsonObject.getString("id")));
                    c.setArea_name(jsonObject.getString("area_name"));
                    c.setPid(Long.valueOf(jsonObject.getString("pid")));
                    c.setLevel(Long.valueOf(level));
                    street.add(c);
                });
                break;
        }
    }

    /**
     * 保存数据
     * @param first
     */
    private void saveData(JSONArray first) {
        /**
         * 一级数据判空
         */
        if (first != null) {
            // 1111111111111111111111111111111111111111111111111111111111111111111111111
            /**
             * 遍历一级数据
             */
            first.forEach(f -> {
                /**
                 * 每一条一级数据
                 */
                JSONObject fi = (JSONObject) f;
                /**
                 * 判断每一条一级数据有没有二级数据
                 */
                if (fi.getJSONArray("children") != null) {
                    // 有二级数据
                    /**
                     * 取出二级数据
                     */
                    JSONArray Second = fi.getJSONArray("children");
                    /**
                     * 保存所有二级数据
                     */
                    joinBatch(Second, 2);
                    // 222222222222222222222222222222222222222222222222222222222222222222222222222222
                    /**
                     * 遍历二级数据
                     */
                    Second.forEach(s -> {
                        /**
                         * 每一条二级数据
                         */
                        JSONObject se = (JSONObject) s;
                        /**
                         * 判断每一条二级数据有没有三级数据
                         */
                        if (se.getJSONArray("children") != null) {
                            // 有三级数据
                            /**
                             * 取出三级数据
                             */
                            JSONArray third = se.getJSONArray("children");
                            /**
                             * 保存所有三级数据
                             */
                            joinBatch(third, 3);
                            // 333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
                            /**
                             * 遍历三级数据
                             */
                            third.forEach(t -> {
                                /**
                                 * 每一条三级数据
                                 */
                                JSONObject th = (JSONObject) t;
                                /**
                                 * 判断每一套三级数据有没有四级数据
                                 */
                                if (th.getJSONArray("children") != null) {
                                    // 有四级数据
                                    /**
                                     * 取出四级数据
                                     */
                                    JSONArray fourth = th.getJSONArray("children");
                                    /**
                                     * 保存所有四级数据
                                     */
                                    joinBatch(fourth, 4);
                                    // 44444444444444444444444444444444444444444444444444444444444444444444444
                                    /**
                                     * 遍历四级数据
                                     */
                                    fourth.forEach(fou -> {
                                        /**
                                         * 每一条四级数据
                                         */
                                        JSONObject fo = (JSONObject) fou;
                                        /**
                                         * 判断每一条四级数据有没有五级数据
                                         */
                                        if (fo.getJSONArray("children") != null) {
                                            /**
                                             * 取出五级数据
                                             */
                                            JSONArray fifth = fo.getJSONArray("children");
                                            /**
                                             * 保存所有五级数据
                                             */
                                            joinBatch(fifth, 5);
                                            // 继续搞
                                        }else {
                                            /**
                                             * 有可能没有五级数据
                                             */
                                        }
                                    });
                                }else {
                                    /**
                                     * 有可能没有四级数据
                                     */
                                }
                            });
                        }else {
                            /**
                             * 有可能没有三级数据
                             */
                        }
                    });
                }else {
                    /**
                     * 不可能没有二级数据
                     */
                }
            });
        }
    }

}
